<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>5. Docker容器数据持久化 | Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="一. 简单介绍数据卷是一个可供一个或者多个容器使用的特殊目录。他绕过UFS，可以提供很多有用的特性。    可以在多个容器之间共享和重用。 对数据卷的修改会立即生效。 对数据卷的更新不会影响容器。 数据卷会默认一直存在，即使容器消失或者被删除。    备注：使用方式上类似与Linux中目录或者文件的mount。在镜像中，被指定为挂载点的文件或者目录会被隐藏掉。能够显示出来的是挂载的数据卷。 二.">
<meta property="og:type" content="article">
<meta property="og:title" content="5. Docker容器数据持久化">
<meta property="og:url" content="http://yoursite.com/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="一. 简单介绍数据卷是一个可供一个或者多个容器使用的特殊目录。他绕过UFS，可以提供很多有用的特性。    可以在多个容器之间共享和重用。 对数据卷的修改会立即生效。 对数据卷的更新不会影响容器。 数据卷会默认一直存在，即使容器消失或者被删除。    备注：使用方式上类似与Linux中目录或者文件的mount。在镜像中，被指定为挂载点的文件或者目录会被隐藏掉。能够显示出来的是挂载的数据卷。 二.">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2020-02-28T09:31:16.227Z">
<meta property="article:modified_time" content="2020-02-29T08:45:41.777Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/myblog/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/myblog/css/style.css">

<meta name="generator" content="Hexo 4.2.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/myblog/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/myblog/">Home</a>
        
          <a class="main-nav-link" href="/myblog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/myblog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-5.Docker 容器数据持久化" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/" class="article-date">
  <time datetime="2020-02-28T09:31:16.227Z" itemprop="datePublished">2020-02-28</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      5. Docker容器数据持久化
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h4 id="一-简单介绍"><a href="#一-简单介绍" class="headerlink" title="一. 简单介绍"></a>一. 简单介绍</h4><p><strong>数据卷</strong>是一个可供一个或者多个容器使用的特殊目录。他绕过UFS，可以提供<br>很多有用的特性。  </p>
<ol>
<li>可以在多个容器之间共享和重用。</li>
<li>对数据卷的修改会立即生效。</li>
<li>对数据卷的更新不会影响容器。</li>
<li>数据卷会默认一直存在，即使容器消失或者被删除。  </li>
</ol>
<p><u>备注：使用方式上类似与Linux中目录或者文件的mount。在镜像中，被指定为<br>挂载点的文件或者目录会被隐藏掉。能够显示出来的是挂载的<strong>数据卷</strong>。</u></p>
<h4 id="二-可以在多个容器之间共享和重用"><a href="#二-可以在多个容器之间共享和重用" class="headerlink" title="二. 可以在多个容器之间共享和重用"></a>二. 可以在多个容器之间共享和重用</h4><p><u>Docker Container 对象 ：对象一旦被销毁，那么数据就不存在了；容器一旦被<br>销毁，则容器内的数据会一并被删除；服务器中的图片也会一并被删除；容器中的数据<br>不是持久化状态。</u>  </p>
<ol>
<li>docker 大体上从上到下分为三层，分别是UFS，docker，HOST OS（宿主机）。通<br>常来讲，Docker Container IO会通过UFS进行写入操作，但是UFS同时也会操作中间体<br>index.html 。   </li>
<li>那么这种方式如果发生了容器销毁或者容器删除操作，那么docker container<br>就无法发挥作用，那么就无法操作UFS，对index.html中间体进行操作了。  </li>
<li>那么所写入的数据也会消失。所以通过设立数据卷可以简化这个过程，通过docker Container 直接对index.html<br>中间体进行操作，那么该操作后中间体直接保留在宿主机的所设立的数据卷中，这样即便是容器消失<br>写出来的数据也依然存在。<h4 id="三-对数据卷的修改会立即生效"><a href="#三-对数据卷的修改会立即生效" class="headerlink" title="三. 对数据卷的修改会立即生效"></a>三. 对数据卷的修改会立即生效</h4><u>简单的介绍就是，对数据卷进行修该配置，那么该修改则会马上在容器中有所体现。</u><h4 id="四-对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除"><a href="#四-对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除" class="headerlink" title="四. 对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除"></a>四. 对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除</h4><u>docker中所有的容器都是根据镜像启动的，同一个镜像，可以启动多个镜像。</u>容器启动后直接访问<br>直接去宿主机的文件就行，并不是直接写入到镜像中的。当时容器被删除的时候，该文件并不会被删除。数据卷<br>又称作docker容器的数据持久化。<h4 id="五-数据卷简单的使用举例"><a href="#五-数据卷简单的使用举例" class="headerlink" title="五. 数据卷简单的使用举例"></a>五. 数据卷简单的使用举例</h4>目标：拿tomcat为例子，创建一个index.html用于显示东西。<br>步骤：  <ol>
<li>创建一个ROOT目录作为数据卷用于替换tomcat中webapps下面的ROOT目录。  </li>
<li>在新创建的ROOT目录下新建index.html写入helloworld 文本，保存。  </li>
<li>启动容器并挂载数据卷。  <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -p <span class="number">8080</span>:<span class="number">8080</span> --name tomcat -d -v /usr/local/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat</span><br></pre></td></tr></table></figure>
解析：对于上述语句，其中 -v表示的是挂载一个数据卷 ，那么-v 之后有两个参数，左侧的是<u>宿主机</u>的<br>数据卷的目录位置，而右侧的是容器的相对应的目录位置。<h4 id="六-部署数据库"><a href="#六-部署数据库" class="headerlink" title="六. 部署数据库"></a>六. 部署数据库</h4>这里介绍的是使用的是mysql来进行举例。<br>MySql 5。7 支持NoSql；<br>MySql 8.0 支持原生分布式数据库解决方案；<br>下载mysql 5.7.22 <blockquote>
<p>docker pull mysql:5.7.22  </p>
</blockquote>
</li>
</ol>
</li>
</ol>
<p>运行MySql</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">docker run -p <span class="number">3306</span>:<span class="number">3306</span> -name mysql \                <span class="number">1</span></span><br><span class="line">-v /usr/local/docker/mysql/conf:/etc/mysql \         <span class="number">2</span></span><br><span class="line">-v /usr/local/docker/mysql/logs:/<span class="keyword">var</span>/log/mysql \     <span class="number">3</span></span><br><span class="line">-v /usr/local/docker/mysql/data:/<span class="keyword">var</span>/lib/mysql \     <span class="number">4</span></span><br><span class="line">-e MYSQL_PASSWORD=<span class="number">123456</span> \                           <span class="number">5</span></span><br><span class="line">-d mysql:<span class="number">5.7</span><span class="number">.22</span>                                      <span class="number">6</span></span><br></pre></td></tr></table></figure>
<p>1表示的是运行一个名称为mysql<br>2，3，4表示将宿主机的文件夹conf，log，lib，设置成数据卷分别对应于docker镜像的根目录下的三个目录<br>/etc/mysql，/var/log/mysql，/var/lib/mysql 。  而 -e 则表示设置环境变量。-d则是以守护态运行。<br>这个环境变量有哪些可以设置，需要去查询mysql官方文档，在mysql的官方文档里面有关于如何设置docker中相关<br>的环境变量的设置参数。<a><a href="https://hub.docker.com/_/mysql" target="_blank" rel="noopener">https://hub.docker.com/_/mysql</a></a> 该连接的文档查询。  </p>
<p>但是mysql的真正使用，需要进行一些基本的配置，而这些配置也需要进行数据卷化。  </p>
<p><u>为新创建的mysql容器设置一个最大的可接收的文件大小，设置为max_allowed_packet = 128M 大。</u><br>实际上，这个需要增加到/etc/mysql/mysql.conf.d目录下面的mysqld.cnf文件里面<br>直接追加到该文件的末尾。<br>步骤：<br>首先需要将容器启动，然后将容器的文件拷贝到宿主机中。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker cp  mysql:/etc/mysql .  ----&gt;将mysql容器中的文件加整个拷贝到宿主机当前目录中</span><br></pre></td></tr></table></figure>
<p>然后将拷贝下来目录中的配置文件 移动到 原来所设置的宿主机的目录 /usr/local/docker/<br>conf 即可，然后对该文件夹进行数据卷设置即可。<br><u>可以使用docker logs 容器名称 即可。查看容器的日志。</u><br><u>可以使用docker logs -f 容器名称 即可一直同步监听容器运行状态的日志。</u></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/" data-id="ck77i1hic0001rkd197ma6idk" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/myblog/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          6. Docker三剑客
        
      </div>
    </a>
  
  
    <a href="/myblog/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">4. Docker的常用命令</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/myblog/archives/2020/02/">February 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/myblog/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/">6. Docker三剑客</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">5. Docker容器数据持久化</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">4. Docker的常用命令</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/10/3.DockerFile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/">3. DockerFile定制镜像</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/05/2.Java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/">2. Java并发编程笔记</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 John Doe<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/myblog/" class="mobile-nav-link">Home</a>
  
    <a href="/myblog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/myblog/fancybox/jquery.fancybox.css">

  
<script src="/myblog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/myblog/js/script.js"></script>




  </div>
</body>
</html>